package com.hedl.practice.diyJava.gather.study_map.test;

import com.hedl.practice.diyJava.gather.study_map.tmp.Student;

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;

/**
 * HashMap是一种通过对key计算hashCode()，通过空间换时间的方式，直接定位到value所在的内部数组的索引，因此，查找效率非常高。
 */
public class StudyMap {
    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {

        Student student = new Student("Xiao Ming",99);
        Map<String,Object> students = new HashMap<>();
        students.put("Xiao Ming",student);
        Map<String,Integer> map = new HashMap<>();
        map.put("apple",123);
        map.put("pear",456);

        Object target = students.get("Xiao Ming");
        System.out.println(target == student);

        //反射获取值
        Class cla = target.getClass();
        Field name = cla.getDeclaredField("name");
        Field age = cla.getDeclaredField("score");
        name.setAccessible(true);
        age.setAccessible(true);
        System.out.println(name.get(student));
        System.out.println(age.get(student));

        System.out.println("=====================================================================");

        Object another = students.get("Bob");
        System.out.println(another);

        System.out.println("=====================================================================");

        //如果只是想查询某个key是否存在，可以调用boolean containsKey(K key)方法
        //始终牢记：Map中不存在重复的key，因为放入相同的key，只会把原有的key-value对应的value给替换掉。
        System.out.println(map.get("apple"));   //123
        map.put("apple",123);       //会覆盖之前的值
        System.out.println(map.get("apple"));   //789

        //在一个Map中，虽然key不能重复，但value是可以重复的：
        map.put("pear",789);

        System.out.println("=====================================================================");

        //遍历Map
        /**
         * 要遍历key可以使用for each循环遍历Map实例的keySet()方法返回的Set集合，它包含不重复的key的集合：
         */
        map.put("banana",789);

        for (String key:map.keySet()){      //先遍历map的key出来
            Integer value = map.get(key);       //循环用key遍历出value
            System.out.println(key+"="+value);      //组合输出key-value
        }

        System.out.println("=====================================================================");

        //同时遍历key和value可以使用for each循环遍历Map对象的entrySet()集合，它包含每一个key-value映射：
        //注意：遍历Map时，不可假设输出的key是有序的！
        for (Map.Entry<String,Integer> entry:map.entrySet()){
            String key = entry.getKey();
            Integer value = entry.getValue();
            System.out.println(key+"="+value);
        }
    }
}
